package com.jvyou.app.ds.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.jvyou.app.common.annotation.AutoDict;
import com.jvyou.app.common.domain.dto.LoginDto;
import com.jvyou.app.common.domain.dto.ResetPasswordDto;
import com.jvyou.app.common.domain.dto.SMSLoginDto;
import com.jvyou.app.common.domain.model.LoginUser;
import com.jvyou.app.common.domain.model.Result;
import com.jvyou.app.common.domain.vo.LoginVo;
import com.jvyou.app.common.domain.vo.SMSTokenVo;
import com.jvyou.app.common.utils.value.ValueChecker;
import com.jvyou.app.ds.service.AuthService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * @author 橘柚
 * @since 2025/3/3 10:51
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/auth")
public class AuthController {

    private final AuthService authService;

    /**
     * 账号密码登录接口
     *
     * @param loginDto 登录请求体
     * @return token
     */
    @PostMapping("/account/login")
    public Result<LoginVo> doLogin(@Valid @RequestBody LoginDto loginDto) {
        log.info("账号密码登录参数：{}", loginDto);
        return authService.doLogin(loginDto);
    }

    /**
     * 手机验证码登录
     *
     * @param smsLoginDto 登录请求体
     * @return token
     */
    @PostMapping("/sms/login")
    public Result<LoginVo> doSMSLogin(@RequestBody @Valid SMSLoginDto smsLoginDto) {
        log.info("手机验证码登录参数：{}", smsLoginDto);
        return authService.doSMSLogin(smsLoginDto);
    }


    /**
     * 获取当前登录的用户信息
     *
     * @return token
     */
    @GetMapping("/currentUser")
    @AutoDict
    public Result<LoginUser> currentUser() {
        log.info("获取当前登录的用户信息");
        return authService.currentUser();
    }

    /**
     * 退出登录
     *
     * @return token
     */
    @GetMapping("/logout")
    public Result<Boolean> logout() {
        log.info("退出登录：{}", StpUtil.getLoginId());
        StpUtil.logout();
        return Result.success(true);
    }

    /**
     * 发送短信验证码
     *
     * @return token
     */
    @GetMapping("/sendSMSCode/{phone}")
    public Result<Boolean> sendSMSCode(@PathVariable String phone) {
        log.info("发送短信验证码：{}", phone);
        ValueChecker.checkChinaPhoneNumber(phone);
        return Result.success(authService.sendSMSCode(phone));
    }


    /**
     * 验证验证码
     *
     * @param phone 手机号
     * @param code  验证码
     */
    @GetMapping("/verifyCode")
    public Result<SMSTokenVo> verifyCode(@RequestParam String phone, @RequestParam String code, @RequestParam String operation) {
        ValueChecker.checkNotEmpty(phone, "手机号不能为空");
        ValueChecker.checkNotEmpty(code, "验证码不能为空");
        ValueChecker.checkNotEmpty(operation, "操作类型不能为空");
        return Result.success(authService.verifyCode(phone, code, operation));
    }

    /**
     * 重置密码
     *
     * @param resetPasswordDto 重置密码参数
     * @return 重置密码结果
     */
    @PostMapping("/resetPassword")
    public Result<Boolean> resetPassword(@RequestBody @Valid ResetPasswordDto resetPasswordDto) {
        return Result.success(authService.resetPassword(resetPasswordDto));
    }

}
